Pythonã®NumPyãããŒããã£ã¹ããå®å šè§£èª¬ãããŒã¿ãµã€ãšã³ã¹ãæ©æ¢°åŠç¿ã§å¿ é ã®ãå¹ççãªé ååœ¢ç¶æäœã®ã«ãŒã«ãé«åºŠãªæè¡ãå®çšäŸãåŠã³ãŸãã
NumPyã®ç䟡ãåŒãåºãïŒãããŒããã£ã¹ããšé ååœ¢ç¶æäœã®åŸ¹åºè§£èª¬
Pythonã«ãã髿§èœãªæ°å€èšç®ã®äžçãžããããïŒããŒã¿ãµã€ãšã³ã¹ãæ©æ¢°åŠç¿ãç§åŠç ç©¶ãéèåæã«æºãã£ãŠããæ¹ãªããééããªãNumPyã«è§Šããããšãããã§ããããNumPyã¯Pythonã®ç§åŠèšç®ãšã³ã·ã¹ãã ã®åºç€ã§ããã匷åãªN次å é åãªããžã§ã¯ããšããããæäœããããã®äžé£ã®é«åºŠãªé¢æ°ãæäŸããŸãã
åå¿è ãäžçŽè ã§ãããçŽé¢ããæãäžè¬çãªããŒãã«ã®äžã€ã¯ãæšæºçãªPythonã®äŒçµ±çãªã«ãŒãããŒã¹ã®æèãããå¹ççãªNumPyã³ãŒãã«å¿ èŠãªãã¯ãã«åãããé åæåã®æèãžãšç§»è¡ããããšã§ãããã®ãã©ãã€ã ã·ããã®äžå¿ã«ã¯ã匷åã§ãããªãããã°ãã°èª€è§£ãããã¡ã«ããºã ããããŒããã£ã¹ããååšããŸããããã¯ãNumPyã圢ç¶ããµã€ãºã®ç°ãªãé åã«å¯ŸããŠæå³ã®ããæäœãå®è¡ã§ããããã«ãããéæ³ãã§ãããæç€ºçãªPythonã«ãŒãã«ããããã©ãŒãã³ã¹ã®äœäžã䌎ããŸããã
ãã®å æ¬çãªã¬ã€ãã¯ãéçºè ãããŒã¿ãµã€ãšã³ãã£ã¹ããã¢ããªã¹ããšãã£ãäžçäžã®èªè ã察象ãšããŠããŸããç§ãã¡ã¯ãããŒããã£ã¹ããåºç€ããè§£ãæããããã®å³æ Œãªã«ãŒã«ãæ¢æ±ãããã®ããã³ã·ã£ã«ãæå€§éã«æŽ»çšããããã®é ååœ¢ç¶æäœããã¹ã¿ãŒããæ¹æ³ã宿ŒããŸããæåŸãŸã§èªãã°ããããŒããã£ã¹ããäœã§ãããã ãã§ãªããã¯ãªãŒã³ã§å¹ççããã€ãããã§ãã·ã§ãã«ãªNumPyã³ãŒããæžãããã«ãªããããéèŠãªã®ããçè§£ã§ããã§ãããã
NumPyãããŒããã£ã¹ããšã¯äœãïŒãã®äžå¿æŠå¿µ
æ žå¿ãèšãã°ããããŒããã£ã¹ããšã¯ãç®è¡æŒç®äžã«NumPyãç°ãªã圢ç¶ã®é åãã©ã®ããã«æ±ãããèšè¿°ããäžé£ã®ã«ãŒã«ã§ãããšã©ãŒãçºçããã代ããã«ãå°ããæ¹ã®é åã倧ããæ¹ã®é åã®åœ¢ç¶ã«åãããããã«ä»®æ³çã«ãåŒã䌞ã°ããããšã§ãæäœãå®è¡ããããã®äºææ§ã®ããæ¹æ³ãèŠã€ããããšããŸãã
åé¡ç¹ïŒåœ¢ç¶ãäžèŽããªãé åã®æäœ
äŸãã°ãå°ããªç»åã®ãã¯ã»ã«å€ã衚ã3x3ã®è¡åãããããã¹ãŠã®ãã¯ã»ã«ã®èŒåºŠã10ã ãäžããããšããŸããæšæºçãªPythonã§ãªã¹ãã®ãªã¹ãã䜿ãå Žåããã¹ãããã«ãŒããæžãããšã«ãªãã§ãããïŒ
Pythonã«ãŒãã«ããã¢ãããŒãïŒé ãæ¹æ³ïŒ
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(len(matrix)):
for j in range(len(matrix[0])):
result[i][j] = matrix[i][j] + 10
# result will be [[11, 12, 13], [14, 15, 16], [17, 18, 19]]
ããã¯æ©èœããŸãããåé·ã§ãããããã«éèŠãªããšã«ã倧ããªé åã«å¯ŸããŠã¯éåžžã«éå¹çã§ããPythonã€ã³ã¿ãŒããªã¿ã¯ã«ãŒãã®åã€ãã¬ãŒã·ã§ã³ã§é«ããªãŒããŒãããã䌎ããŸããNumPyã¯ããã®ããã«ããã¯ãè§£æ¶ããããã«èšèšãããŠããŸãã
解決çïŒãããŒããã£ã¹ãã®éæ³
NumPyã䜿ãã°ãåãæäœãã·ã³ãã«ããšã¹ããŒãã®æš¡ç¯ãšãªããŸãïŒ
NumPyãããŒããã£ã¹ãã«ããã¢ãããŒãïŒéãæ¹æ³ïŒ
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = matrix + 10
# result will be:
# array([[11, 12, 13],
# [14, 15, 16],
# [17, 18, 19]])
ããã¯ã©ã®ããã«æ©èœããã®ã§ããããïŒ `matrix`ã®åœ¢ç¶ã¯`(3, 3)`ã§ããã®ã«å¯Ÿããã¹ã«ã©ãŒ`10`ã®åœ¢ç¶ã¯`()`ã§ããNumPyã®ãããŒããã£ã¹ãã¡ã«ããºã ã¯ç§ãã¡ã®æå³ãçè§£ããŸãããã¹ã«ã©ãŒ`10`ãä»®æ³çã«ãåŒã䌞ã°ãããŸãã¯ããããŒããã£ã¹ããããŠè¡åã®`(3, 3)`圢ç¶ã«åããããã®åŸãèŠçŽ ããšã®å ç®ãå®è¡ããã®ã§ãã
éèŠãªã®ã¯ããã®åŒã䌞ã°ããä»®æ³çã§ãããšããããšã§ããNumPyã¯ã¡ã¢ãªå ã«10ã§åãå°œããããæ°ãã3x3ã®é åãäœæããŸãããããã¯Cèšèªã¬ãã«ã®å®è£ ã§å®è¡ãããéåžžã«å¹ççãªããã»ã¹ã§ãããåäžã®ã¹ã«ã©ãŒå€ãåå©çšããããšã§ãå€§å¹ ãªã¡ã¢ãªãšèšç®æéãç¯çŽããŸããããããããããŒããã£ã¹ãã®æ¬è³ªã§ããã€ãŸããå®éã«åœ¢ç¶ãäºææ§ã®ãããã®ã«ããã¡ã¢ãªã³ã¹ããªãã«ãããããäºææ§ããããã®ããã«ç°ãªã圢ç¶ã®é åã«å¯ŸããŠæäœãå®è¡ããã®ã§ãã
ãããŒããã£ã¹ãã®ã«ãŒã«ïŒè¬ãè§£ãæãã
ãããŒããã£ã¹ãã¯éæ³ã®ããã«èŠãããããããŸãããã2ã€ã®ã·ã³ãã«ã§å³æ Œãªã«ãŒã«ã«ãã£ãŠæ¯é ãããŠããŸãã2ã€ã®é åãæäœãããšããNumPyã¯ãããã®åœ¢ç¶ãå³ç«¯ïŒæ«å°ŸïŒã®æ¬¡å ããé ã«èŠçŽ ããšã«æ¯èŒããŸãããããŒããã£ã¹ããæåããããã«ã¯ããã¹ãŠã®æ¬¡å ã®æ¯èŒã«ãããŠãããã2ã€ã®ã«ãŒã«ãæºããããªããã°ãªããŸããã
ã«ãŒã«1ïŒæ¬¡å ã®æŽå
次å ãæ¯èŒããåã«ãNumPyã¯2ã€ã®é åã®åœ¢ç¶ãæ«å°Ÿã®æ¬¡å ã§æŠå¿µçã«æŽåãããŸããäžæ¹ã®é åã®æ¬¡å æ°ã仿¹ããå°ãªãå Žåã倧ããæ¹ã®é åãšåãæ¬¡å æ°ã«ãªããŸã§ããã®å·ŠåŽã«ãµã€ãº1ã®æ¬¡å ãåã蟌ãŸããŸãã
äŸïŒ
- é åAã®åœ¢ç¶ã¯ `(5, 4)`
- é åBã®åœ¢ç¶ã¯ `(4,)`
NumPyã¯ãããæ¬¡ã®ããã«æ¯èŒããŸãïŒ
- Aã®åœ¢ç¶ïŒ`5 x 4`
- Bã®åœ¢ç¶ïŒ` 4`
Bã®æ¬¡å æ°ãå°ãªãããããã®å³æãã®æ¯èŒã§ã¯ããã£ã³ã°ãããŸããããããã`(5, 4)`ãš`(5,)`ãæ¯èŒããå Žåã¯ç¶æ³ãç°ãªãããšã©ãŒã«ã€ãªãããŸããããã«ã€ããŠã¯åŸã»ã©èª¬æããŸãã
ã«ãŒã«2ïŒæ¬¡å ã®äºææ§
æŽååŸãæ¯èŒããã忬¡å ã®ãã¢ïŒå³ããå·ŠãžïŒã«å¯ŸããŠã以äžã®æ¡ä»¶ã®ãããããçã§ãªããã°ãªããŸããïŒ
- 次å ãçããã
- 次å ã®ã©ã¡ããã1ã§ããã
ãããã®æ¡ä»¶ããã¹ãŠã®æ¬¡å ã®ãã¢ã«å¯ŸããŠæãç«ã€å Žåãé åã¯ããããŒããã£ã¹ãäºæãã§ãããšèŠãªãããŸããçµæãšããŠåŸãããé åã®åœ¢ç¶ã¯ã忬¡å ã«ã€ããŠãå ¥åé åã®æ¬¡å ã®ãµã€ãºã®ãã¡æå€§å€ãæã€ããšã«ãªããŸãã
ããããã®æç¹ã§ãããã®æ¡ä»¶ãæºããããªãå ŽåãNumPyã¯åŠçãäžæããã`operands could not be broadcast together with shapes ...`ãã®ãããªæç¢ºãªã¡ãã»ãŒãžãšãšãã«`ValueError`ãçºçãããŸãã
å®è·µäŸïŒãããŒããã£ã¹ãã®åäœ
ãããã®ã«ãŒã«ãžã®çè§£ããåçŽãªãã®ããè€éãªãã®ãŸã§ãäžé£ã®å®è·µçãªäŸã§åºããŠãããŸãããã
äŸ1ïŒæãåçŽãªã±ãŒã¹ - ã¹ã«ã©ãŒãšé å
ããã¯æåã«èŠãäŸã§ããã«ãŒã«ã«ç §ãããŠåæããŠã¿ãŸãããã
A = np.array([[1, 2, 3], [4, 5, 6]]) # 圢ç¶: (2, 3)
B = 10 # 圢ç¶: ()
C = A + B
åæïŒ
- 圢ç¶ïŒ Aã¯`(2, 3)`ãBã¯å®è³ªçã«ã¹ã«ã©ãŒã§ãã
- ã«ãŒã«1ïŒæŽåïŒïŒ NumPyã¯ã¹ã«ã©ãŒãä»»æã®äºææ§ã®ããæ¬¡å ã®é åãšããŠæ±ããŸãããã®åœ¢ç¶ã`(1, 1)`ã«ããã£ã³ã°ããããšèããããšãã§ããŸãã`(2, 3)`ãš`(1, 1)`ãæ¯èŒããŠã¿ãŸãããã
- ã«ãŒã«2ïŒäºææ§ïŒïŒ
- æ«å°Ÿã®æ¬¡å ïŒ`3` vs `1`ãæ¡ä»¶2ãæºããããŸãïŒäžæ¹ã1ïŒã
- æ¬¡ã®æ¬¡å ïŒ`2` vs `1`ãæ¡ä»¶2ãæºããããŸãïŒäžæ¹ã1ïŒã
- çµæã®åœ¢ç¶ïŒ 忬¡å ãã¢ã®æå€§å€ã¯`(max(2, 1), max(3, 1))`ãã€ãŸã`(2, 3)`ã§ããã¹ã«ã©ãŒ`10`ã¯ãã®åœ¢ç¶å šäœã«ãããŒããã£ã¹ããããŸãã
äŸ2ïŒ2Dé åãš1Dé åïŒè¡åãšãã¯ãã«ïŒ
ããã¯éåžžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ãäŸãã°ããŒã¿è¡åã«ç¹åŸŽéããšã®ãªãã»ããã远å ããå Žåãªã©ã§ãã
A = np.arange(12).reshape(3, 4) # 圢ç¶: (3, 4)
# A = array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
B = np.array([10, 20, 30, 40]) # 圢ç¶: (4,)
C = A + B
åæïŒ
- 圢ç¶ïŒ Aã¯`(3, 4)`ãBã¯`(4,)`ã§ãã
- ã«ãŒã«1ïŒæŽåïŒïŒ 圢ç¶ãå³ã«æããŸãã
- Aã®åœ¢ç¶ïŒ`3 x 4`
- Bã®åœ¢ç¶ïŒ` 4`
- ã«ãŒã«2ïŒäºææ§ïŒïŒ
- æ«å°Ÿã®æ¬¡å ïŒ`4` vs `4`ãæ¡ä»¶1ãæºããããŸãïŒçããïŒã
- æ¬¡ã®æ¬¡å ïŒ`3` vs `(ãªã)`ãå°ããé åã«æ¬¡å ããªãå Žåããã®æ¬¡å ã®ãµã€ãºã¯1ã§ãããã®ããã«æ±ãããŸãããããã£ãŠã`3` vs `1`ãæ¯èŒããŸããæ¡ä»¶2ãæºããããŸããBã®å€ã¯ãã®æ¬¡å ã«æ²¿ã£ãŠåŒã䌞ã°ããããããããŒããã£ã¹ããããŸãã
- çµæã®åœ¢ç¶ïŒ çµæã®åœ¢ç¶ã¯`(3, 4)`ã§ãã1Dé
å`B`ã¯ã`A`ã®åè¡ã«å¹æçã«å ç®ãããŸãã
# C will be: # array([[10, 21, 32, 43], # [14, 25, 36, 47], # [18, 29, 40, 51]])
äŸ3ïŒåãã¯ãã«ãšè¡ãã¯ãã«ã®çµã¿åãã
åãã¯ãã«ãšè¡ãã¯ãã«ãçµã¿åããããšã©ããªãã§ããããïŒ ããã§ãããŒããã£ã¹ãã¯åŒ·åãªå€éšç©ã®ãããªæ¯ãèããçã¿åºããŸãã
A = np.array([0, 10, 20]).reshape(3, 1) # 圢ç¶: (3, 1) åãã¯ãã«
# A = array([[ 0],
# [10],
# [20]])
B = np.array([0, 1, 2]) # 圢ç¶: (3,)ã (1, 3)ã§ãå¯
# B = array([0, 1, 2])
C = A + B
åæïŒ
- 圢ç¶ïŒ Aã¯`(3, 1)`ãBã¯`(3,)`ã§ãã
- ã«ãŒã«1ïŒæŽåïŒïŒ 圢ç¶ãæããŸãã
- Aã®åœ¢ç¶ïŒ`3 x 1`
- Bã®åœ¢ç¶ïŒ` 3`
- ã«ãŒã«2ïŒäºææ§ïŒïŒ
- æ«å°Ÿã®æ¬¡å ïŒ`1` vs `3`ãæ¡ä»¶2ãæºããããŸãïŒäžæ¹ã1ïŒãé å`A`ã¯ãã®æ¬¡å ïŒåïŒã«æ²¿ã£ãŠåŒã䌞ã°ãããŸãã
- æ¬¡ã®æ¬¡å ïŒ`3` vs `(ãªã)`ãåè¿°ã®éããããã¯`3` vs `1`ãšããŠæ±ããŸããæ¡ä»¶2ãæºããããŸããé å`B`ã¯ãã®æ¬¡å ïŒè¡ïŒã«æ²¿ã£ãŠåŒã䌞ã°ãããŸãã
- çµæã®åœ¢ç¶ïŒ 忬¡å
ãã¢ã®æå€§å€ã¯`(max(3, 1), max(1, 3))`ãã€ãŸã`(3, 3)`ã§ããçµæã¯å®å
šãªè¡åã«ãªããŸãã
# C will be: # array([[ 0, 1, 2], # [10, 11, 12], # [20, 21, 22]])
äŸ4ïŒãããŒããã£ã¹ãã®å€±æïŒValueErrorïŒ
ãããŒããã£ã¹ãããã€å€±æããããçè§£ããããšãåæ§ã«éèŠã§ãã3x4è¡åã®ååã«é·ã3ã®ãã¯ãã«ãå ããŠã¿ãŸãããã
A = np.arange(12).reshape(3, 4) # 圢ç¶: (3, 4)
B = np.array([10, 20, 30]) # 圢ç¶: (3,)
try:
C = A + B
except ValueError as e:
print(e)
ãã®ã³ãŒãã¯æ¬¡ã®ãšã©ãŒãåºåããŸãïŒoperands could not be broadcast together with shapes (3,4) (3,)
åæïŒ
- 圢ç¶ïŒ Aã¯`(3, 4)`ãBã¯`(3,)`ã§ãã
- ã«ãŒã«1ïŒæŽåïŒïŒ 圢ç¶ãå³ã«æããŸãã
- Aã®åœ¢ç¶ïŒ`3 x 4`
- Bã®åœ¢ç¶ïŒ` 3`
- ã«ãŒã«2ïŒäºææ§ïŒïŒ
- æ«å°Ÿã®æ¬¡å ïŒ`4` vs `3`ãããã§å€±æïŒ 次å ãçãããªããã©ã¡ãã1ã§ã¯ãããŸãããNumPyã¯çŽã¡ã«åæ¢ãã`ValueError`ãçºçãããŸãã
ãã®å€±æã¯è«ççã§ããNumPyã¯ãµã€ãº3ã®ãã¯ãã«ããµã€ãº4ã®è¡ãšã©ã®ããã«æããã°ãããåãããŸãããç§ãã¡ã®æå³ã¯ãããããåãã¯ãã«ãå ããããšã§ããããã®ããã«ã¯ãé åBã®åœ¢ç¶ãæç€ºçã«æäœããå¿ èŠãããããããæ¬¡ã®ãããã¯ã«ã€ãªãããŸãã
ãããŒããã£ã¹ãã®ããã®é ååœ¢ç¶æäœããã¹ã¿ãŒãã
å€ãã®å ŽåãããŒã¿ã¯å®è¡ãããæäœã«æé©ãªåœ¢ç¶ã«ãªã£ãŠããŸãããNumPyã¯ãé åããããŒããã£ã¹ãäºæã«ããããã«åœ¢ç¶å€æŽããã³æäœããããã®è±å¯ãªããŒã«ã»ãããæäŸããŸããããã¯ãããŒããã£ã¹ãã®æ¬ é¥ã§ã¯ãªãããããæå³ãæç¢ºã«ããããšã匷å¶ããæ©èœã§ãã
`np.newaxis`ã®å
é åãäºææ§ã®ãããã®ã«ããããã®æãäžè¬çãªããŒã«ã¯`np.newaxis`ã§ããããã¯ãæ¢åã®é åã®æ¬¡å ããµã€ãº1ã®æ¬¡å ã ãå¢ããããã«äœ¿çšãããŸããããã¯`None`ã®ãšã€ãªã¢ã¹ãªã®ã§ãããç°¡æœãªæ§æã®ããã«`None`ã䜿çšããããšãã§ããŸãã
åã®å€±æäŸãä¿®æ£ããŸããããç§ãã¡ã®ç®æšã¯ããã¯ãã«`B`ã`A`ã®ååã«å ããããšã§ããããã¯ã`B`ã圢ç¶`(3, 1)`ã®åãã¯ãã«ãšããŠæ±ãããå¿ èŠãããããšãæå³ããŸãã
A = np.arange(12).reshape(3, 4) # 圢ç¶: (3, 4)
B = np.array([10, 20, 30]) # 圢ç¶: (3,)
# newaxisã䜿ã£ãŠæ°ããæ¬¡å
ã远å ããBãåãã¯ãã«ã«å€æ
B_reshaped = B[:, np.newaxis] # 圢ç¶ã¯ (3, 1) ã«ãªã
# B_reshaped ã¯æ¬¡ã®ããã«ãªã:
# array([[10],
# [20],
# [30]])
C = A + B_reshaped
ä¿®æ£ã®åæïŒ
- 圢ç¶ïŒ Aã¯`(3, 4)`ãB_reshapedã¯`(3, 1)`ã§ãã
- ã«ãŒã«2ïŒäºææ§ïŒïŒ
- æ«å°Ÿã®æ¬¡å ïŒ`4` vs `1`ãOKïŒäžæ¹ã1ïŒã
- æ¬¡ã®æ¬¡å ïŒ`3` vs `3`ãOKïŒçããïŒã
- çµæã®åœ¢ç¶ïŒ `(3, 4)`ã§ãã`(3, 1)`ã®åãã¯ãã«ãAã®4ã€ã®åã«ããã£ãŠãããŒããã£ã¹ããããŸãã
# C will be: # array([[10, 11, 12, 13], # [24, 25, 26, 27], # [38, 39, 40, 41]])
`[:, np.newaxis]`æ§æã¯ã1Dé åãåãã¯ãã«ã«å€æããããã®ãNumPyã«ãããæšæºçã§éåžžã«èªã¿ãããã€ãã£ãªã ã§ãã
`reshape()` ã¡ãœãã
é åã®åœ¢ç¶ã倿Žããããã®ããäžè¬çãªããŒã«ã¯`reshape()`ã¡ãœããã§ããããã¯ãèŠçŽ ã®ç·æ°ãåãã§ããéããæ°ãã圢ç¶ãå®å šã«æå®ããããšãã§ããŸãã
äžèšãšåãçµæã`reshape`ã䜿ã£ãŠéæããããšãã§ããŸããïŒ
B_reshaped = B.reshape(3, 1) # B[:, np.newaxis] ãšåã
`reshape()`ã¡ãœããã¯éåžžã«åŒ·åã§ãç¹ã«ç¹å¥ãªåŒæ°`-1`ã䜿ããšãNumPyã«é åã®ç·ãµã€ãºãšä»ã®æå®ãããæ¬¡å ã«åºã¥ããŠãã®æ¬¡å ã®ãµã€ãºãèªåçã«èšç®ãããããšãã§ããŸãã
x = np.arange(12)
# 4è¡ã«åœ¢ç¶å€æŽããåã®æ°ã¯èªåçã«èšç®ããã
x_reshaped = x.reshape(4, -1) # 圢ç¶ã¯ (4, 3) ã«ãªã
`.T`ã«ãã転眮
é åã転眮ãããšããã®è»žã亀æãããŸãã2Dé åã®å Žåãè¡ãšåãå ¥ãæ¿ãããŸãããããããããŒããã£ã¹ãæäœã®åã«åœ¢ç¶ãæŽããããã®äŸ¿å©ãªããŒã«ãšãªãåŸãŸãã
A = np.arange(12).reshape(3, 4) # 圢ç¶: (3, 4)
A_transposed = A.T # 圢ç¶: (4, 3)
ç¹å®ã®ãããŒããã£ã¹ããšã©ãŒãä¿®æ£ããã«ã¯çŽæ¥çã§ã¯ãããŸãããã転眮ãçè§£ããããšã¯ããããŒããã£ã¹ãæäœã«å ç«ã£ãŠè¡ãããããšãå€ãäžè¬çãªè¡åæäœã«ãšã£ãŠäžå¯æ¬ ã§ãã
é«åºŠãªãããŒããã£ã¹ãã®å¿çšãšãŠãŒã¹ã±ãŒã¹
ã«ãŒã«ãšããŒã«ããã£ãããšææ¡ãããšããã§ããããŒããã£ã¹ãããšã¬ã¬ã³ãã§å¹ççãªè§£æ±ºçãå¯èœã«ããããã€ãã®å®äžçã®ã·ããªãªãæ¢ã£ãŠã¿ãŸãããã
1. ããŒã¿æ£èŠåïŒæšæºåïŒ
æ©æ¢°åŠç¿ã«ãããåºæ¬çãªååŠçã¹ãããã¯ãç¹åŸŽéãæšæºåããããšã§ããéåžžã¯ãå¹³åå€ãåŒããæšæºåå·®ã§å²ãããšã«ãã£ãŠè¡ãããŸãïŒZã¹ã³ã¢æ£èŠåïŒããããŒããã£ã¹ãã¯ãããç°¡åã«ããŸãã
1,000åã®ãµã³ãã«ãš5ã€ã®ç¹åŸŽéãæã€ããŒã¿ã»ãã`X`ãæ³åããŠãã ããããã®åœ¢ç¶ã¯`(1000, 5)`ã«ãªããŸãã
# ãµã³ãã«ããŒã¿ãçæ
np.random.seed(0)
X = np.random.rand(1000, 5) * 100
# åç¹åŸŽéïŒåïŒã®å¹³åå€ãšæšæºåå·®ãèšç®
# axis=0 ã¯åã«æ²¿ã£ãŠæäœãå®è¡ããããšãæå³ãã
mean = X.mean(axis=0) # 圢ç¶: (5,)
std = X.std(axis=0) # 圢ç¶: (5,)
# ãããŒããã£ã¹ãã䜿ã£ãŠããŒã¿ãæ£èŠå
X_normalized = (X - mean) / std
åæïŒ
- `X - mean`ã§ã¯ã圢ç¶`(1000, 5)`ãš`(5,)`ã®é åãæäœããŠããŸãã
- ããã¯ãŸãã«äŸ2ãšåãã§ãã圢ç¶`(5,)`ã®`mean`ãã¯ãã«ã¯ã`X`ã®1000è¡ãã¹ãŠã«ããã£ãŠãããŒããã£ã¹ããããŸãã
- `std`ã«ããé€ç®ã§ãåããããŒããã£ã¹ããçºçããŸãã
ãããŒããã£ã¹ãããªããã°ãã«ãŒããæžãå¿ èŠããããããã¯äœæ¡ãé ããããåé·ã«ãªããŸãã
2. ãããããšèšç®ã®ããã®ã°ãªããçæ
ããŒãããããçé«ç·ãããããäœæãããªã©ã2Dã®ç¹ã°ãªããäžã§é¢æ°ãè©äŸ¡ãããå ŽåããããŒããã£ã¹ãã¯æé©ãªããŒã«ã§ãããã®ç®çã«ã¯`np.meshgrid`ããã䜿ãããŸãããæåã§åãçµæãåŸãããšã§ããã®èåŸã«ãããããŒããã£ã¹ãã®ã¡ã«ããºã ãçè§£ããããšãã§ããŸãã
# x軞ãšy軞ã®1Dé
åãäœæ
x = np.linspace(-5, 5, 11) # åœ¢ç¶ (11,)
y = np.linspace(-4, 4, 9) # åœ¢ç¶ (9,)
# newaxisã䜿ã£ãŠãããŒããã£ã¹ãã®æºåããã
x_grid = x[np.newaxis, :] # åœ¢ç¶ (1, 11)
y_grid = y[:, np.newaxis] # åœ¢ç¶ (9, 1)
# è©äŸ¡ãã颿°ãäŸïŒf(x, y) = x^2 + y^2
# ãããŒããã£ã¹ããå®å
šãª2Dã®çµæã°ãªãããçæãã
z = x_grid**2 + y_grid**2 # çµæã®åœ¢ç¶: (9, 11)
åæïŒ
- 圢ç¶`(1, 11)`ã®é åãšåœ¢ç¶`(9, 1)`ã®é åãå ããŠããŸãã
- ã«ãŒã«ã«åŸãã`x_grid`ã¯9è¡ã«ããã£ãŠäžã«ãããŒããã£ã¹ãããã`y_grid`ã¯11åã«ããã£ãŠæšªã«ãããŒããã£ã¹ããããŸãã
- çµæã¯ããã¹ãŠã®`(x, y)`ãã¢ã§é¢æ°ãè©äŸ¡ããå€ãå«ã`(9, 11)`ã®ã°ãªããã«ãªããŸãã
3. ãã¢ã¯ã€ãºè·é¢è¡åã®èšç®
ããã¯ããé«åºŠã§ãããä¿¡ããããªãã»ã©åŒ·åãªäŸã§ãã`D`次å 空éå ã®`N`åã®ç¹ã®ã»ããïŒåœ¢ç¶`(N, D)`ã®é åïŒãäžãããããšãããã¹ãŠã®ç¹ã®ãã¢éã®è·é¢ã®`(N, N)`è¡åãå¹ççã«èšç®ããã«ã¯ã©ãããã°ããã§ããããïŒ
éµã¯ã`np.newaxis`ã䜿ã£ãŠ3DãããŒããã£ã¹ãæäœãèšå®ããå·§åŠãªããªãã¯ã§ãã
# 2次å
空éå
ã®5ã€ã®ç¹
np.random.seed(42)
points = np.random.rand(5, 2)
# ãããŒããã£ã¹ãã®ããã«é
åãæºå
# pointsã(5, 1, 2)ã«åœ¢ç¶å€æŽ
P1 = points[:, np.newaxis, :]
# pointsã(1, 5, 2)ã«åœ¢ç¶å€æŽ
P2 = points[np.newaxis, :, :]
# P1 - P2ã®ãããŒããã£ã¹ãã¯æ¬¡ã®åœ¢ç¶ã«ãªãïŒ
# (5, 1, 2)
# (1, 5, 2)
# çµæã®åœ¢ç¶ã¯ (5, 5, 2) ã«ãªã
diff = P1 - P2
# ãŠãŒã¯ãªããè·é¢ã®äºä¹ãèšç®
# æåŸã®è»žïŒD次å
ïŒã«æ²¿ã£ãŠäºä¹åãèšç®
dist_sq = np.sum(diff**2, axis=-1)
# å¹³æ¹æ ¹ããšã£ãŠæçµçãªè·é¢è¡åãååŸ
distances = np.sqrt(dist_sq) # æçµçãªåœ¢ç¶: (5, 5)
ãã®ãã¯ãã«åãããã³ãŒãã¯ã2ã€ã®ãã¹ãããã«ãŒãã眮ãæããã¯ããã«å¹ççã§ããããã¯ãé åã®åœ¢ç¶ãšãããŒããã£ã¹ãã®èгç¹ããèããããšããè€éãªåé¡ãããã«ãšã¬ã¬ã³ãã«è§£æ±ºã§ãããã瀺ã蚌ã§ãã
ããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒãªããããŒããã£ã¹ããéèŠãªã®ã
ç§ãã¡ã¯ããããŒããã£ã¹ããšãã¯ãã«åãPythonã«ãŒããããé«éã§ãããšç¹°ãè¿ã䞻匵ããŠããŸãããç°¡åãªãã¹ãã§ããã蚌æããŸãããã2ã€ã®å€§ããªé åããäžåºŠã¯ã«ãŒãã§ãäžåºŠã¯NumPyã§å ç®ããŸãã
ãã¯ãã«å vs. ã«ãŒãïŒã¹ããŒããã¹ã
ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«Pythonã®çµã¿èŸŒã¿`time`ã¢ãžã¥ãŒã«ã䜿çšã§ããŸããJupyter Notebookã®ãããªå®äžçã®ã·ããªãªãã€ã³ã¿ã©ã¯ãã£ããªç°å¢ã§ã¯ãããå³å¯ãªæž¬å®ã®ããã«`%timeit`ããžãã¯ã³ãã³ãã䜿çšãããããããŸããã
import time
# 倧ããªé
åãäœæ
a = np.random.rand(1000, 1000)
b = np.random.rand(1000, 1000)
# --- æ¹æ³1ïŒPythonã«ãŒã ---
start_time = time.time()
c_loop = np.zeros_like(a)
for i in range(a.shape[0]):
for j in range(a.shape[1]):
c_loop[i, j] = a[i, j] + b[i, j]
loop_duration = time.time() - start_time
# --- æ¹æ³2ïŒNumPyãã¯ãã«å ---
start_time = time.time()
c_numpy = a + b
numpy_duration = time.time() - start_time
print(f"Pythonã«ãŒãã®æèŠæé: {loop_duration:.6f} ç§")
print(f"NumPyãã¯ãã«åã®æèŠæé: {numpy_duration:.6f} ç§")
print(f"NumPyã¯çŽ {loop_duration / numpy_duration:.1f} åé«éã§ãã")
ãã®ã³ãŒããäžè¬çãªãã·ã³ã§å®è¡ãããšãNumPyããŒãžã§ã³ã100åãã1000åé«éã§ããããšã瀺ãããŸããé åãµã€ãºã倧ãããªãã«ã€ããŠããã®å·®ã¯ããã«åçã«ãªããŸããããã¯ãã€ããŒãªæé©åã§ã¯ãªããæ ¹æ¬çãªããã©ãŒãã³ã¹ã®éãã§ãã
ãå éšãã§ã®ã¢ããã³ããŒãž
ãªãNumPyã¯ãããªã«éãã®ã§ããããïŒ ãã®çç±ã¯ã¢ãŒããã¯ãã£ã«ãããŸãïŒ
- ã³ã³ãã€ã«æžã¿ã³ãŒãïŒ NumPyã®æäœã¯Pythonã€ã³ã¿ãŒããªã¿ã«ãã£ãŠå®è¡ãããŸããããããã¯äºåã«ã³ã³ãã€ã«ããããé«åºŠã«æé©åãããCãŸãã¯Fortranã®é¢æ°ã§ããåçŽãª`a + b`ã¯ãåäžã®é«éãªC颿°ãåŒã³åºããŸãã
- ã¡ã¢ãªã¬ã€ã¢ãŠãïŒ NumPyé åã¯ãäžè²«ããããŒã¿åãæã€ã¡ã¢ãªå ã®å¯ãªããŒã¿ãããã¯ã§ããããã«ãããåºç€ãšãªãCã³ãŒãã¯ãPythonãªã¹ãã«é¢é£ããåãã§ãã¯ããã®ä»ã®ãªãŒããŒããããªãã«ãããããå埩åŠçã§ããŸãã
- SIMD (Single Instruction, Multiple Data)ïŒ çŸä»£ã®CPUã¯ãè€æ°ã®ããŒã¿ã«å¯ŸããŠåæã«åãæäœãå®è¡ã§ããŸããNumPyã®ã³ã³ãã€ã«æžã¿ã³ãŒãã¯ããããã®ãã¯ãã«åŠçèœåãæŽ»çšããããã«èšèšãããŠãããããã¯æšæºçãªPythonã«ãŒãã§ã¯äžå¯èœã§ãã
ãããŒããã£ã¹ãã¯ãããããã¹ãŠã®å©ç¹ãç¶æ¿ããŸããããã¯ãé åã®åœ¢ç¶ãå®å šã«äžèŽããªãå Žåã§ãããã¯ãã«åãããCæäœã®åã«ã¢ã¯ã»ã¹ã§ããã¹ããŒããªã¬ã€ã€ãŒã§ãã
ããããèœãšã穎ãšãã¹ããã©ã¯ãã£ã¹
ãããŒããã£ã¹ãã¯åŒ·åã§ãããæ³šæãå¿ èŠã§ãã以äžã«ãäžè¬çãªåé¡ãšå¿ã«çããŠããã¹ããã¹ããã©ã¯ãã£ã¹ãããã€ã瀺ããŸãã
æé»çãªãããŒããã£ã¹ãããã°ãé ãããšããã
ãããŒããã£ã¹ãã¯æã ãããŸããããããšããããããé åã®åœ¢ç¶ã«æ³šæããªããšãæå³ããªãçµæãçã¿åºãå¯èœæ§ããããŸããäŸãã°ã`(3, 3)`è¡åã«`(3,)`é åãå ããããšã¯ã§ããŸããã`(4,)`é åãå ãããšå€±æããŸãã誀ã£ãŠééã£ããµã€ãºã®ãã¯ãã«ãäœæããå ŽåããããŒããã£ã¹ãã¯å©ããŠããããæ£ãããšã©ãŒãçºçãããŸãããã埮åŠãªãã°ã¯ãè¡ãã¯ãã«ãšåãã¯ãã«ã®æ··åããçããŸãã
圢ç¶ãæç€ºçã«ãã
ãã°ãé¿ããã³ãŒãã®æç¢ºããåäžãããããã«ã¯ãæç€ºçã§ããããšããã°ãã°æåã§ããåãã¯ãã«ã远å ããã€ãããªãã`reshape`ã`np.newaxis`ã䜿ã£ãŠãã®åœ¢ç¶ã`(N, 1)`ã«ããŸããããã«ãããä»ã®äººïŒãããŠæªæ¥ã®èªåïŒã«ãšã£ãŠã³ãŒããèªã¿ããããªããNumPyã«å¯ŸããŠæå³ãæç¢ºã§ããããšãä¿èšŒãããŸãã
ã¡ã¢ãªã«é¢ããèæ ®äºé
ãããŒããã£ã¹ãèªäœã¯ã¡ã¢ãªå¹çãè¯ãïŒäžéã³ããŒã¯äœæãããªãïŒã§ãããæäœã®çµæã¯ããããŒããã£ã¹ããããæå€§ã®åœ¢ç¶ãæã€æ°ããé åã§ããããšãå¿ããªãã§ãã ããã`(10000, 1)`ã®é åãš`(1, 10000)`ã®é åããããŒããã£ã¹ããããšãçµæã¯`(10000, 10000)`ã®é åã«ãªããããã¯ããªãã®éã®ã¡ã¢ãªãæ¶è²»ããå¯èœæ§ããããŸããåžžã«åºåé åã®åœ¢ç¶ãæèããŠãã ããã
ãã¹ããã©ã¯ãã£ã¹ã®ãŸãšã
- ã«ãŒã«ãç¥ãïŒ ãããŒããã£ã¹ãã®2ã€ã®ã«ãŒã«ãå åšåãããŸããããçåãããå Žåã¯ã圢ç¶ãæžãåºããŠæåã§ç¢ºèªããŠãã ããã
- 圢ç¶ãé »ç¹ã«ãã§ãã¯ããïŒ éçºäžããããã°äžã«`array.shape`ãå€çšããŠãé åãæåŸ éãã®æ¬¡å ãæã£ãŠããããšã確èªããŠãã ããã
- æç€ºçã«ããïŒ è¡ãåãšããŠè§£éãããå¯èœæ§ã®ãã1Dãã¯ãã«ãæ±ãå Žåã¯ç¹ã«ã`np.newaxis`ã`reshape`ã䜿ã£ãŠæå³ãæç¢ºã«ããŠãã ããã
- `ValueError`ãä¿¡é ŒããïŒ NumPyããªãã©ã³ãããããŒããã£ã¹ãã§ããªãã£ããšèšãå Žåãããã¯ã«ãŒã«ãç Žãããããã§ããããã«æããã圢ç¶ãåæããæå³ã«åãããŠé åãå圢æããŠãã ããã
çµè«
NumPyã®ãããŒããã£ã¹ãã¯åãªã䟿å©ãªæ©èœä»¥äžã®ãã®ã§ãããPythonã«ãããå¹ççãªæ°å€ããã°ã©ãã³ã°ã®ç€ã§ããããã¯ãNumPyã¹ã¿ã€ã«ãå®çŸ©ãããã¯ãªãŒã³ã§èªã¿ããããè¶ é«éãªãã¯ãã«åã³ãŒããå¯èœã«ãããšã³ãžã³ã§ãã
ç§ãã¡ã¯ã圢ç¶ãäžèŽããªãé åã®æäœãšããåºæ¬æŠå¿µãããäºææ§ãæ¯é ãã峿 Œãªã«ãŒã«ããããŠ`np.newaxis`ã`reshape`ã䜿ã£ãåœ¢ç¶æäœã®å®è·µçãªäŸãŸã§ãæ ããŠããŸããããããã®ååãæ£èŠåãè·é¢èšç®ãšãã£ãå®äžçã®ããŒã¿ãµã€ãšã³ã¹ã®ã¿ã¹ã¯ã«ã©ã®ããã«é©çšãããããèŠãŠãåŸæ¥ã®ã«ãŒãã«å¯Ÿããèšãç¥ããªãããã©ãŒãã³ã¹äžã®å©ç¹ã蚌æããŸããã
èŠçŽ ããšã®æèããé åå šäœã®æäœãžãšç§»è¡ããããšã§ãNumPyã®çã®åãè§£ãæŸã€ããšãã§ããŸãããããŒããã£ã¹ããåãå ¥ãã圢ç¶ã®èгç¹ããèããã°ãããå¹ççã§ããããããã§ãã·ã§ãã«ã§ããã匷åãªç§åŠæè¡ããã³ããŒã¿é§ååã®ã¢ããªã±ãŒã·ã§ã³ãPythonã§æžãããšãã§ããããã«ãªãã§ãããã